package com.gitee.wsl.android.imageloader

import android.graphics.drawable.Drawable
import android.net.Uri
import android.widget.ImageView
import com.gitee.wsl.result.EntryResult
import kotlinx.coroutines.flow.Flow


interface Loader {

    /**
     * 加载网路图片
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    显示图片的View
     * @param corner  显示圆角的图片
     * @param desId   默认图片的Id*/
     
    fun displayImageRound(
        url: String,
        view: ImageView,
        corner: Int,
        desId: Int
    )

    /**
     * 加载Uri的图片
     *
     * @param context 上下文
     * @param url     Uri
     * @param view    显示图片的view
     * @param desId   默认的图片*/
     
    fun displayImage( url: Uri, view: ImageView, desId: Int)

    /**
     * 加载URL图片，设置是否跳过缓存
     *
     * @param context     上下文
     * @param url         url
     * @param view        显示图片的view
     * @param desId       默认的图片
     * @param isSkipCache 是否跳过缓存， 默认是false*/
     
    fun displayImage(
        url: String,
        view: ImageView,
        desId: Int,
        isSkipCache: Boolean = false
    )

    /**
     * 指定图片大小加载
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    显示图片的View
     * @param height  指定图片高度
     * @param width   指定图片宽度
     * @param desId   默认图片Id*/
     
    fun displayImage(
        url: String,
        view: ImageView,
        height: Int,
        width: Int,
        desId: Int
    )

    /**
     * 指定图片大小加载
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    显示图片的View
     * @param height  指定图片高度
     * @param width   指定图片宽度
     * @param desId   默认图片Id*/
     
    fun displayImage(
        url: String,
        view: ImageView,
        height: Int,
        width: Int,
        sizeMultiplier: Float,
        desId: Int
    )

    /**
     * 加载本地图片
     *
     * @param context 上下文
     * @param url     图片地址
     * @param view    显示图片的View
     * @param desId   默认图片的Id*/
     
    fun displayLocalImage(
        url: String,
        view: ImageView,
        desId: Int
    )
    

    /**
     * 设置图片的四周圆角*/
     
    fun displayImageRound(
        url: String,
        view: ImageView,
        desId: Int,
        leftTop: Boolean = true,
        rightTop: Boolean = true,
        leftBottom: Boolean = true,
        rightBottom: Boolean = true,
        roundRadius: Float
    )

     //** 控件 
     fun <T> into(url: String, target: T, config: ImageLoadScope.() -> Unit)

    /**
     * 清除内存缓存
     *
     * @param context 上下文*/
     
    fun clearMemory()

    /**
     * 清理磁盘缓存
     *
     * @param context 上下文*/
     
    fun clearDiskCache()

    /**
     * 程序在内存清理的时候执行
     *
     * @param context
     * @param level*/
     
    fun trimMemory(level: Int)

    /**
     * 低内存的时候执行
     *
     * @param context*/
     
    fun clearAllMemoryCaches()

    /**
     * 恢复请求
     *
     * @param context*/
     
    fun resumeRequest()

   /* *
     * 停止请求
     *
     * @param context*/
     
    fun pauseRequest()
}

object ImageLoaderOp: Loader {
    override fun displayImageRound(url: String, view: ImageView, corner: Int, desId: Int) {
        TODO("Not yet implemented")
    }

    override fun displayImageRound(
        url: String,
        view: ImageView,
        desId: Int,
        leftTop: Boolean,
        rightTop: Boolean,
        leftBottom: Boolean,
        rightBottom: Boolean,
        roundRadius: Float
    ) {
        TODO("Not yet implemented")
    }

    override fun displayImage(url: Uri, view: ImageView, desId: Int) {
        TODO("Not yet implemented")
    }

    override fun displayImage(url: String, view: ImageView, desId: Int, isSkipCache: Boolean) {
        TODO("Not yet implemented")
    }

    override fun displayImage(url: String, view: ImageView, height: Int, width: Int, desId: Int) {
        TODO("Not yet implemented")
    }

    override fun displayImage(
        url: String,
        view: ImageView,
        height: Int,
        width: Int,
        sizeMultiplier: Float,
        desId: Int
    ) {
        TODO("Not yet implemented")
    }

    override fun displayLocalImage(url: String, view: ImageView, desId: Int) {
        TODO("Not yet implemented")
    }

    override fun <T> into(url: String, target: T, config: ImageLoadScope.() -> Unit) {
        TODO("Not yet implemented")
    }

    override fun clearMemory() {
        TODO("Not yet implemented")
    }

    override fun clearDiskCache() {
        TODO("Not yet implemented")
    }

    override fun trimMemory(level: Int) {
        TODO("Not yet implemented")
    }

    override fun clearAllMemoryCaches() {
        TODO("Not yet implemented")
    }

    override fun resumeRequest() {
        TODO("Not yet implemented")
    }

    override fun pauseRequest() {
        TODO("Not yet implemented")
    }

}



interface ImageLoadScope{

    fun getBaseScope():Any

    //** 加载大小 
    fun targetSize(width: Int, height: Int)

    //** 遮照颜色 
    fun maskColor(maskColor: Int)

    //** 圆角 
    fun roundAngle(angle: Float)

    //** 加载圆形 
    fun circleCrop()

    //** gif 转换 
    fun asGif(getGifDrawable: Boolean = false)

    //** centerCrop 配置 
    fun centerCrop()

    //** centerInside 配置 
    fun centerInside()

    //** fitCenter 配置 
    fun fitCenter()

    //** 跳过本地缓存 
    fun skipLocalCache()

    //** 跳过网络缓存 
    fun skipNetCache()

    /*** 是否跳过裁剪 ,默认false ，如果获取到图片高宽会 override 高宽
     * 通过设置true 跳过裁剪避免一些原图被放大，
     * */
    fun skipOverride(skip: Boolean)

    //** 跳过内存缓存 
    fun skipMemoryCache()

    //** 占位图 
    fun placeholder(placeholder: Int)

    //** 出错时占位图 
    fun error(resId: Int)

    //** 占位图 
    fun placeholder(placeholder: Drawable)

    //** 出错时占位图 
    fun error(drawable: Drawable)

    fun loadState(): Flow<EntryResult<Any,Any>>
}

